iT邦幫忙

2025 iThome 鐵人賽

DAY 18
1

大家好,這裡是鐵匠史密斯
前兩天初步推論與驗證 javidx9 提供的式子,確認距離與牆壁高矮的關係(反比)
我們之前的code在編譯、執行過後,可以看到角色在世界地圖 (8, 3) 的位置,從 fPlayerA = 0fAOV = 3.14159f / 4.0f 看到的結果如圖:
https://ithelp.ithome.com.tw/upload/images/20250818/20157653PTWDegQhP1.png
記得主控台大小要調整的跟 nScreenWidth = 120nScreenHeight = 40 一樣哦!

接下來就是旋轉角色的方向 fPlayerA 了,讓我們直接開始吧!

視角的轉動

我們先直接上code,明日再敘述一下原理~

// Controls
// Handle rotation
if (GetAsyncKeyState((unsigned short)'Q') & 0x8000)
    fPlayerA += (0.1f);

if (GetAsyncKeyState((unsigned short)'E') & 0x8000)
    fPlayerA -= (0.1f);

一樣地,我們借助了 Windows.h 微軟的套件來幫助我們偵測是否有特定按鍵被按下去~
當特定按鍵(QE) 被按下時,更改角色方向 fPlayerA
但是,為什麼需要使用 &0x8000 呢?
這也是目前小弟我最困惑的部分,但查了幾個文獻後,可以知道 GetAsyncKeyState 會回傳 16個位元(bit)的值,像是:

0000 0000 0000 0000   (十進位 = 0)

其實可以使用code來測試按鍵的狀態

int main()
{
	while (true)
	{
		short a = GetAsyncKeyState((unsigned short)'A');
		printf("A key state: %d\n", a);
		Sleep(1000);
	}
    return 0;
}

回傳的主控台數值以及發現的規律如下:
https://ithelp.ithome.com.tw/upload/images/20250818/20157653sx8RWdAVLX.png
另外,查了資料發現,int -32767 相當於16進位的 0x8001!
所以,就我認知,GetAsyncKeyState((unsigned short)'Q') & 0x8000 應當是確保Q鍵是持續按下的,才會更改玩家視角

設置完後,我們就可以旋轉玩家的方向 fPlayerA 啦:
https://ithelp.ithome.com.tw/upload/images/20250818/20157653B9GfMHnSpk.png

今日總結

  • 搭配 GetAsyncKeyState() 移動玩家視角 fPlayerA
  • 初步了解 GetAsyncKeyState() 以及 0x8000 之間的關聯

對於 16-bit 整數 以及 16進位 的部分真的要好好回去惡補~
明日應該會講述一下旋轉的原理,我們就可以進行下一步了~
繼續~走~下去~~

Reference

  1. GetAsyncKeyState 函式 (winuser.h)

上一篇
Day 17 | Ray Casting : 距離決定牆壁的高矮 - Part 3
下一篇
Day19 | Ray Casting: 視角的轉動 - Part 2
系列文
用 C++ 實作簡易第一人稱視角遊戲:從入門到理解 Ray Casting30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言